package com.duck.duckchatbackend.controller;

import com.duck.duckchatbackend.annotation.GlobalInterceptor;
import com.duck.duckchatbackend.entity.config.AppConfig;
import com.duck.duckchatbackend.entity.constans.Constants;
import com.duck.duckchatbackend.entity.enums.AppUpdateFileTypeEnum;
import com.duck.duckchatbackend.entity.po.AppUpdate;
import com.duck.duckchatbackend.entity.vo.AppUpdateVO;
import com.duck.duckchatbackend.entity.vo.ResponseVO;
import com.duck.duckchatbackend.service.AppUpdateService;
import com.duck.duckchatbackend.utils.CopyTools;
import com.duck.duckchatbackend.utils.StringTools;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.io.File;
import java.util.Arrays;

@RestController("updateController")
@RequestMapping("/update")
public class UpdateController extends ABaseController {
    @Resource
    private AppUpdateService appUpdateService;

    @Resource
    private AppConfig appConfig;

    @RequestMapping("/checkVersion")
    @GlobalInterceptor
    public ResponseVO loadAllCategory(String appVersion, String uid) {

        // 检查appVersion是否为空，如果为空则返回一个成功的响应，其中不包含数据
        if (StringTools.isEmpty(appVersion)) {
            return getSuccessResponseVO(null);
        }

        // 通过appVersion和uid获取最新的应用更新信息
        AppUpdate appUpdate = appUpdateService.getLatestUpdate(appVersion, uid);

        // 如果没有找到更新信息，则返回一个成功的响应，其中不包含数据
        if (appUpdate == null) {
            return getSuccessResponseVO(null);
        }

        // 将AppUpdate对象转换为AppUpdateVO对象
        AppUpdateVO updateVO = CopyTools.copy(appUpdate, AppUpdateVO.class);

        // 根据文件类型设置更新包的大小
        if (AppUpdateFileTypeEnum.LOCAL.getType().equals(appUpdate.getFileType())) {
            // 如果是本地文件，计算文件大小并设置到updateVO中
            File file = new File(appConfig.getProjectFolder() + Constants.APP_UPDATE_FOLDER + appUpdate.getId() + Constants.APP_EXE_SUFFIX);
            updateVO.setSize(file.length());
        } else {
            // 如果不是本地文件，设置大小为0
            updateVO.setSize(0L);
        }

        // 将更新描述数组转换为列表并设置到updateVO中
        updateVO.setUpdateList(Arrays.asList(appUpdate.getUpdateDescArray()));

        // 构造文件名并设置到updateVO中
        String fileName = Constants.APP_NAME + appUpdate.getVersion() + Constants.APP_EXE_SUFFIX;
        updateVO.setFileName(fileName);

        // 返回一个包含更新信息的成功响应
        return getSuccessResponseVO(updateVO);
    }
}
